package util

import (
	"fmt"
	"sync"
)

type AsyncTask struct {
	ChanLen int
	TaskNum int
	Chan    chan any
	Wg      sync.WaitGroup
}

func (t *AsyncTask) Start(taskFunc func(any)) chan any {

	// 控制并发数为10
	t.Chan = make(chan any, t.ChanLen) // 任务通道

	// 1. 启动10个worker协程
	for i := 0; i < t.TaskNum; i++ {
		t.Wg.Add(1)
		go t.worker(i, taskFunc)
	}

	//// 2. 将数据分发到jobs通道
	//for _, num := range data {
	//	jobs <- num
	//}
	//close(jobs) // 关闭通道，表示任务分发完毕
	//
	//// 3. 等待所有worker完成
	//wg.Wait()

	return t.Chan
}

func (t *AsyncTask) Stop() {
	close(t.Chan) // 关闭通道，表示任务分发完毕
	t.Wg.Wait()   // 3. 等待所有worker完成
}

// worker函数：处理数据
func (t *AsyncTask) worker(id any, taskFunc func(any)) {
	defer t.Wg.Done() // 协程结束时通知WaitGroup

	fmt.Printf("异步任务[%v]开始\n", id)
	for job := range t.Chan {
		taskFunc(job)
	}
}
